package echo.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import javax.sound.sampled.Line;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * @author： zhangnan
 * @date： 2025/4/9 17:09
 * @description： TODO
 * @modifiedBy：日志处理器类，继承自 ChannelInboundHandlerAdapter，用于处理入站事件并记录日志
 * @version: 1.0
 */
public class LoggingHandler extends ChannelInboundHandlerAdapter {

    // 创建一个日志记录器，用于记录该处理器的相关信息
    private static final Logger logger = Logger.getLogger(LoggingHandler.class.getName());
    // 该处理器的名称，用于在日志中区分不同的日志处理器
    private final String name;

    // 构造函数
    public LoggingHandler(String name) {
        this.name = name;
    }

    // 当通道有数据可读时会调用此方法
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        // 记录开始处理消息的日志，包含处理器名称和接收到的消息
        logger.log(Level.INFO,"{0} - 开始处理消息： {1}",new Object[]{name,msg});
        // 将接收到的消息传递给下一个处理器继续处理
        ctx.fireChannelRead(msg);
        // 记录消息处理完成日志，包含处理器名称
        logger.log(Level.INFO,"{0} - 消息处理完成",name);
        ctx.write(msg);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx){
        // 将缓冲区中的数据刷新到客户端
        ctx.flush();
    }

    // 当通道处理过程中发生异常时会调用此方法
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause) {
        logger.log(Level.INFO,"{0} - 发生异常： ",new Object[]{name,cause});
        // 关闭通道，释放资源
        ctx.close();

    }

}
